//
//  NewViewController.m
//  runtime
//
//  Created by dihuijun on 17/3/28.
//  Copyright © 2017年 Cycle. All rights reserved.
//

#import "NewViewController.h"
#import "Person.h"
@interface NewViewController ()
/**   datasource   */
@property (nonatomic, strong) NSMutableArray<NSString *> *datasource;
@end

@implementation NewViewController

/*
 泛型：限制类型
 泛型使用场景：
 1.集合中使用范型（数组，字典，NSSet）
 2.当声明一个类，类里面的某些属性的类型不确定，这时候我们才使用范型
 范型智能修饰方法的调用
 
 好处：
 1.提高我们开发规范，减少程序员之间的交流
 2.通过集合取出对象，直接当作范型对象使用，可以直接点语法
 */

/*
 __convariant(协变):用户范型数据强转类型，可以向上强转，子类 可以转成父类
 __contravariant(逆变)：用于范型数据强转类型，可以向下强转，父类 可以 转成 子类
 <__convariant ObjectType>
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"iOS9新特性范型";
    self.view.backgroundColor = [UIColor whiteColor];
    
    ///规定类型
//    self.datasource addObject:(nonnull NSString *)
    
//self.datasource[0].length
    Person<LanguageFather *> *father = [Person sharePerson];
    //指定类
    Person<iOS *> *p = [Person sharePerson];
    p.language       = [iOS shareiOS];
    p.language.name  = @"哈哈哈";
    NSLog(@"%@",p.language.name);
    NSLog(@"%@",p.language.getnames);
    
    ///逆变
    p = father;
    ///指定类
    Person<Java *> *j = [Person sharePerson];
    j.language        = [[Java alloc]init];
    
    
    
}



@end
